package com.rickpan.service;

import com.rickpan.entity.Tag;

import java.util.List;

/**
 * 标签服务接口
 * 
 * @author RickPan Team
 * @since 2024-01-06
 */
public interface TagService {

    /**
     * 创建标签
     * 
     * @param userId 用户ID
     * @param name 标签名称
     * @param color 标签颜色
     * @param type 标签类型
     * @return 标签记录
     */
    Tag createTag(Long userId, String name, String color, String type);

    /**
     * 更新标签
     * 
     * @param tagId 标签ID
     * @param userId 用户ID
     * @param name 标签名称
     * @param color 标签颜色
     * @return 更新后的标签记录
     */
    Tag updateTag(Long tagId, Long userId, String name, String color);

    /**
     * 删除标签
     * 
     * @param tagId 标签ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteTag(Long tagId, Long userId);

    /**
     * 获取标签详情
     * 
     * @param tagId 标签ID
     * @param userId 用户ID
     * @return 标签记录
     */
    Tag getTagDetail(Long tagId, Long userId);

    /**
     * 获取用户的所有标签
     * 
     * @param userId 用户ID
     * @return 标签列表
     */
    List<Tag> getAllTags(Long userId);

    /**
     * 根据类型获取标签
     * 
     * @param userId 用户ID
     * @param type 标签类型
     * @return 标签列表
     */
    List<Tag> getTagsByType(Long userId, String type);

    /**
     * 搜索标签
     * 
     * @param userId 用户ID
     * @param keyword 搜索关键词
     * @return 标签列表
     */
    List<Tag> searchTags(Long userId, String keyword);

    /**
     * 获取热门标签
     * 
     * @param userId 用户ID
     * @return 热门标签列表
     */
    List<Tag> getPopularTags(Long userId);

    /**
     * 增加标签使用次数
     * 
     * @param tagId 标签ID
     * @param userId 用户ID
     */
    void incrementUsageCount(Long tagId, Long userId);

    /**
     * 获取标签统计信息
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    TagStats getTagStats(Long userId);

    /**
     * 标签统计DTO
     */
    class TagStats {
        private long totalTags;
        private long fileTags;
        private long noteTags;
        
        public TagStats(long totalTags, long fileTags, long noteTags) {
            this.totalTags = totalTags;
            this.fileTags = fileTags;
            this.noteTags = noteTags;
        }
        
        public long getTotalTags() { return totalTags; }
        public void setTotalTags(long totalTags) { this.totalTags = totalTags; }
        public long getFileTags() { return fileTags; }
        public void setFileTags(long fileTags) { this.fileTags = fileTags; }
        public long getNoteTags() { return noteTags; }
        public void setNoteTags(long noteTags) { this.noteTags = noteTags; }
    }
}
